--InfoUI.lua
require 'fairygui.Window'

InfoUI = class(Window)
local prop = property(InfoUI)

function InfoUI:__init()
    self:loadLayout("InfoUI", "Main")
end

function InfoUI:initEvent()
    self:getChild("close").onClick:Add(function()
        self:close()
    end)
end

-- 打开UI执行一次
function InfoUI:initComponent()
    local list = self:getChild("list")
    local store = g_store_mgr:getCurStore()

    -- 计算并显示大小统计
    self:displaySizeStatistics(store, list)
end

-- 计算store中各表数据大小的方法
function InfoUI:calculateValueSizes(store)
    local sizes = {}
    local total_all_sheets = 0

    -- 第一次遍历：计算每个表的大小
    for sheet_name, sheet_data in pairs(store.sheets) do
        local sheet_total = 0

        for key, value in pairs(sheet_data) do
            -- 使用json.pretty将值序列化为字符串，然后计算长度
            local json_str = json.pretty(value)
            local size = #json_str
            sheet_total = sheet_total + size
        end

        sizes[sheet_name] = sheet_total
        total_all_sheets = total_all_sheets + sheet_total
    end

    -- 保存总大小和各表大小信息
    sizes._total = total_all_sheets

    return sizes
end

-- 辅助函数：将bytes转换为kb
function InfoUI:bytesToKB(bytes)
    return bytes / 1024
end

-- 在UI上显示大小统计信息（按大小从大到小排序，使用kb单位）
function InfoUI:displaySizeStatistics(store, list)
    local sizes = self:calculateValueSizes(store)
    local total_all_sheets = sizes._total or 1 -- 避免除零错误
    local total_kb = self:bytesToKB(total_all_sheets)

    -- 清空列表
    list:RemoveChildrenToPool()

    -- 添加总大小行作为第一行
    local total_node = list:AddItemFromPool("ui://nk9ejx23fqrmixicv0")
    total_node:GetChild("title").text = "表名"
    total_node:GetChild("percent").text = "占比"
    total_node:GetChild("size").text = "大小"

    -- 将表数据转换为数组以便排序
    local sheet_array = {}
    for sheet_name, sheet_size in pairs(sizes) do
        if sheet_name ~= "_total" then
            table.insert(sheet_array, {name = sheet_name, size = sheet_size})
        end
    end

    -- 按大小从大到小排序
    table.sort(sheet_array, function(a, b)
        return a.size > b.size
    end)
    local playerSize = 0
    -- 按排序后的顺序显示信息
    for _, sheet_info in ipairs(sheet_array) do
        local node = list:AddItemFromPool("ui://nk9ejx23fqrmixicv0")

        -- 在title上显示表名
        node:GetChild("title").text = sheet_info.name

        -- 在percent上显示该表占总大小的百分比
        local percentage = (sheet_info.size / total_all_sheets) * 100
        node:GetChild("percent").text = string.format("%.2f%%", percentage)

        -- 显示大小，转换为KB单位
        local size_kb = self:bytesToKB(sheet_info.size)
        node:GetChild("size").text = string.format("%.2f KB", size_kb)
        if sheet_info.name:find("player_") then
            playerSize = playerSize + size_kb
        end

        -- 打印详细信息到控制台以便调试
        print(string.format("表名: %s, 大小: %.2f KB, 占比: %.2f%%",
            sheet_info.name, size_kb, percentage))
    end

    -- 显示总大小 玩家大小 世界大小
    self:getChild("totalSize").text = string.format("%.2f KB", total_kb)
    self:getChild("playerSize").text = string.format("%.2f KB", playerSize)
    self:getChild("worldSize").text = string.format("%.2f KB", total_kb - playerSize)
end